package com.bjpowerrnode.javase.array.homework;
/*
        第一题：
        编写程序，使用一维数组，模拟栈数据结构。
        要求：
        1、这个栈可以存储java中的任何类型的数据结构
        2、在栈中提供push方法模拟压栈。(栈满了有提示信息)
        3、在栈中提供pop方法模拟弹栈。(栈空了也要有提示信息)
        4、编写测试程序，new栈对象，调用push pop方法来模拟压栈弹栈的动作。
public class Mystack{//栈类
    //提供一个数组来存储栈中的元素
    Object[] elements;

    //栈帧（永远指向栈顶部的元素）
    int index;

    //构造方法
    给初始化数组一个初始化容量。

    //push方法(push方法压栈)
    //压栈表示多一个元素
    //但是栈如果已满，压栈失败

    //pop方法
    //pop表示栈中少一个元素。

}
 */
public class Mystack {
    //向栈中存储元素，我们这里使用一维数组。存储到栈中，就表示存储到数组中。
    //为什么使用Object类型的数组？因为Object类型的数组可以存储任何类型的数据:基本数据类型和引用数据类型。
    private Object[] elements;

    //栈帧，永远指向栈顶部
    //private int  indest = 0;//如果index采用0，表示栈帧指向了顶部元素的上方。
    private int  indest ;//如果index采用-1，表示栈帧指向了顶部元素。


    //构造方法
    public Mystack(){
        this.elements = new Object[10];
        this.indest = -1;
    }

    public Mystack(Object[] elements){
        this.elements = elements;
    }


    //set和get方法也许用不上，但是你必须的写上，这是规矩。
    public void setElements(Object[] elements){
        this.elements = elements;
    }

    public Object[] getElements(){
        return elements;
    }

    public int getIndest() {
        return indest;
    }

    public void setIndest(int indest) {
        this.indest = indest;
    }

    //压栈方法
    public void push(Object obj){
        if (this.indest >= this.elements.length -1) {
            System.out.println("栈已满，压栈失败，程序结束。");
            return;
        }
        //this.indest++;
        this.elements[++indest] = obj;//++出现在变量前表示先自加1后赋值。
        System.out.println("栈的大小为：" + this.elements.length + "; 目前栈帧的位置为:" + (this.indest+1));
    }

    //弹栈方法
    public Object pop(){
        if(indest <= 0){
            System.out.println("栈以空，无法在弹栈");
            return null;
        }

       Object temp = elements[indest];
        elements[indest] =null;
        indest--;
        System.out.println("栈的大小为：" + elements.length + "; 目前栈帧的位置为:" + (indest+1));
        return temp;
    }
}
